package org.xurui.bsj.protocol.command.impl;

import org.hswebframework.web.bean.FastBeanCopier;
import org.jetlinks.core.message.DeviceMessage;
import org.jetlinks.core.message.codec.FromDeviceMessageContext;
import org.jetlinks.core.message.property.ReportPropertyMessage;
import org.springframework.util.StringUtils;
import org.xurui.bsj.protocol.command.CmdCodec;
import org.xurui.bsj.protocol.enums.CommandEnum;
import org.xurui.bsj.protocol.msg.BsjMessage;
import org.xurui.bsj.protocol.utils.ArrayUtils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 设备登录
 */
public class CmdCodec_DEVICE_LOGIN implements CmdCodec {
    @Override
    public boolean supportsCmd(String cmd) {
        return CommandEnum.DEVICE_LOGIN.name().equals(cmd);
    }

    @Override
    public List<DeviceMessage> parsePayload(BsjMessage payload, FromDeviceMessageContext context) {
        //例子：[867082058798193,89860000192027575560,202106302223280000,DE VICE_LOGIN,3,20210630222328,22,5@1@1@1@1@100@0]
        /**
         * 报文体格式： 终端普通键数量
         *              @终端有没有SOS键
         *              @终端类型
         *              @终端是否具备区域报警功能
         *              @终端是否具备设置呼入号码功能
         *              @终端软件协议版本
         * 字段说明： 1.终端普通键数量(如值是 5 则表示终端有 5 个按键，序号为 1-5)
         *            2. 终端有没有 SOS 键(0=没有,1=有)
         *            3. 终端类型： 第一位：(1=GPS,2=CellID,3=AGPS) 第二位测温模块 1 有 0 没有 第三位心率模块 1 有 0 没
         *            4. 终端是否支持区域报警终端侧解决方案功能(0=不具备, 1=具备)
         *            5. 终端是否具备设置呼入号码功能(0=不具 备, 1=具备)
         *            6. 终端软件协议版本号,一共 3 位,第一位为 大版本号,第二位第三位为小版本号,目前该 字段值为 100，小版本号为 0 为每一版本的基 础版本
         *            7.RFID 号码此号码是RFID13.56M、RFID2.4G， 这个号码是 10 进制的，一般是以 13.56M 的号 码这准(无法获取到该参数则该项目取值为0)
         */

        ReportPropertyMessage reportPropertyMessage = ReportPropertyMessage.create();
        reportPropertyMessage.setDeviceId(payload.getHeader().getDeviceNo());
        reportPropertyMessage.setCode(payload.getHeader().getCmd());
        reportPropertyMessage.setMessageId(payload.getHeader().getOrderNo());
        reportPropertyMessage.setTimestamp(System.currentTimeMillis());
        Map<String, Object> properties = new HashMap<>();
        String tempBody = payload.getTempBody();
        String[] tempBodyArr = tempBody.split("@");
        properties.put("header", payload.getHeader().toMap());

        /**
         * 终端普通键数量(如值是 5 则表示终端有 5 个按键，序号为 1-5)
         */
        properties.put("keyNum", ArrayUtils.getStrByIndex(tempBodyArr,0));
        /**
         * 终端有没有 SOS 键(0=没有,1=有)
         */
        properties.put("hasSos",ArrayUtils.getStrByIndex(tempBodyArr,1));
        /**
         * 第一位：(1=GPS,2=CellID,3=AGPS) 第二位测温模块 1 有 0 没有 第三位心率模块 1 有 0 没
         */
        String deviceType="";
        String hasTemperature="0";
        String hasHeartRate="0";
        if(!StringUtils.isEmpty(ArrayUtils.getStrByIndex(tempBodyArr,2))){
            if(tempBodyArr[2].length()>=1){
                if(String.valueOf(tempBodyArr[2].charAt(0)).equals("1")){
                    deviceType="GPS";
                }else if(String.valueOf(tempBodyArr[2].charAt(0)).equals("2")){
                    deviceType="CellID";
                }else if(String.valueOf(tempBodyArr[2].charAt(0)).equals("3")){
                    deviceType="AGPS";
                }
            }
            if(tempBodyArr[2].length()>=2){
                hasTemperature=String.valueOf(tempBodyArr[2].charAt(1));
            }
            if(tempBodyArr[2].length()>=3){
                hasHeartRate=String.valueOf(tempBodyArr[2].charAt(2));
            }

            properties.put("deviceType",deviceType);
            properties.put("measureTemperature",hasTemperature);
            properties.put("heartRate",hasHeartRate);
        }


        /**
         * 终端是否支持区域报警终端侧解决方案功
         * 能(0=不具备, 1=具备)
         */
        properties.put("supportAreaWarning",ArrayUtils.getStrByIndex(tempBodyArr,3));
        /**
         * 终端是否具备设置呼入号码功能(0=不具 备, 1=具备)
         */
        properties.put("supportSetCall",ArrayUtils.getStrByIndex(tempBodyArr,4));
        /**
         * 终端软件协议版本号,一共 3 位,
         * 第一位为 大版本号,
         * 第二位第三位为小版本号,目前该 字段值为 100，小版本号为 0 为每一版本的基 础版本
         */
        properties.put("protocolVersion",ArrayUtils.getStrByIndex(tempBodyArr,5));

        /**
         * RFID 号码此号码是RFID13.56M、RFID2.4G， 这个号码是 10 进制的，一般是以 13.56M 的号 码这准(无法获取到该参数则该项目取值为0)
         */
        properties.put("rfid",ArrayUtils.getStrByIndex(tempBodyArr,6));

        reportPropertyMessage.setProperties(properties);

        //回复消息
        //标识通信方向，取值如下: 1.下发请求 2.下发响应 3.上报请求 4.上报响应
        //说明：平台下发请求标示 1，则终 端响应标示为 2，终端上报接口标 示为 3，平台响应标示为 4
        //组装需要回复设备消息提
        /**
         * 报文体格式： 应答状态(0=设置成功;1=非平台用户;2=设置 异常;) 发送短信 1 发送 0 不发送 注册成功
         * 0@端口号@是否发送短信 注册失败 1@0@0 登录0@0@0
         */
        payload.setTempReplyBody("0@0@0");
        return genDeviceMessage(reportPropertyMessage);
    }
}
